// 结构体

// 实例化结构体
// package main

// import "fmt"

// type Book struct {
// 	title  string
// 	author string
// 	num    int
// 	id     int
// }

// func main() {
// 	// 标准实例化
// 	// var book1 Book
// 	// new 实例化
// 	// book1 := new(Book)
// 	// 取地址实例化
// 	// book1 := &Book{}

// 	// 键值对格式初始化
// 	// book1 := &Book{
// 	// 	title:  "golang",
// 	// 	author: "Tom",
// 	// 	num:    20,
// 	// 	id:     1234,
// 	// }
// 	book1 := &Book{
// 		"golang",
// 		"Tom",
// 		20,
// 		1234,
// 	}

// 	fmt.Println("title:", book1.title)
// 	fmt.Println("author:", book1.author)
// 	fmt.Println("num:", book1.num)
// 	fmt.Println("id:", book1.id)

// 	fmt.Println(book1)
// }

// 结构图方法  go语言中 方法 就是一个包含了接受者的函数， 接收者可以是结构体类型的值或者指针
// 指针类型接收者

// package main

// import "fmt"

// type User struct {
// 	Name  string
// 	Email string
// }

// func (u *User) ChangeName() {
// 	// 指针类型接收者
// 	u.Name = "Tom"
// }

// func (u User) ChangeNameByValue() {
// 	// 值类型接收者
// 	u.Name = "Zero"
// }

// func main() {
// 	u := &User{"Peter", "go@go.com"}
// 	fmt.Println("Name:", u.Name, "Email:", u.Email)
// 	u.ChangeName()
// 	fmt.Println("Name:", u.Name, "Email:", u.Email)
// 	u.ChangeNameByValue()
// 	fmt.Println("Name:", u.Name, "Email:", u.Email)

// }

// 结构体内嵌
// package main

// import "fmt"

// type Book struct {
// 	title  string
// 	author string
// 	num    int
// 	id     int
// }

// type BookBorrow struct {
// 	Book
// 	borrowTime string
// }

// type BookNotBorrow struct {
// 	Book
// 	readTime string
// }

// func main() {
// 	// bookBorrow := &BookBorrow{}
// 	// bookNotBorrow := &BookNotBorrow{}
// 	// fmt.Println(bookBorrow)
// 	// fmt.Println(bookNotBorrow)

// 	// 初始化结构体内嵌
// 	bookBorrow := &BookBorrow{
// 		Book:       Book{"golang", "Tom", 20, 152368},
// 		borrowTime: "30",
// 	}
// 	fmt.Println(bookBorrow)
// 	bookNotBorrow := &BookNotBorrow{}
// 	bookNotBorrow.title = "python"
// 	bookNotBorrow.author = "geduo"
// 	bookNotBorrow.num = 10
// 	bookNotBorrow.id = 123
// 	bookNotBorrow.readTime = "50"
// 	fmt.Println(bookNotBorrow)

// }

// 内嵌匿名结构体  定义时无需type关键字 但是在初始化被嵌入的匿名结构体是， 需要再次声明结构体才能赋值
// package main

// import "fmt"

// type BookBorrow struct {
// 	Book struct {
// 		title  string
// 		author string
// 		num    int
// 		id     int
// 	}
// 	borrowTime string
// }

// func main() {
// 	bookBorrow := &BookBorrow{
// 		Book: struct {
// 			title  string
// 			author string
// 			num    int
// 			id     int
// 		}{
// 			"golang",
// 			"Tom",
// 			20,
// 			123,
// 		},
// 		borrowTime: "30",
// 	}
// 	fmt.Println(bookBorrow)

// }

// 匿名结构体使用 一般用来组织全局变量、构建数据模板和解析json等
// package main

// import (
// 	"encoding/json"
// 	"fmt"
// )

// var config struct {
// 	IP string
// 	Port int
// }

// config.IP = "127.0.0.1"
// config.Port = 80

// func main() {
// 	data := &struct { // 对象引用
// 		// data := struct { // 值传递
// 		Code int
// 		Msg  string
// 	}{}
// 	jsonData := `{"code":200, "msg":""}`
// 	if err := json.Unmarshal([]byte(jsonData), data); err != nil { // data 参数需要指针对象
// 		fmt.Println(err)
// 	}
// 	fmt.Println("code:", data.Code)
// 	fmt.Println("msg:", data.Msg)

// }

// 使用结构体解析XML文件
package main

import (
	"encoding/xml"
	"fmt"
	"io/ioutil"
	"path"
	"runtime"
)

type Result struct {
	Person []Person
}

type Person struct {
	Name      string
	Age       string
	Interests Interests
}

type Interests struct {
	Interest []string
}

func getCurrentPath() string {
	_, filename, _, ok := runtime.Caller(1)
	var cwdPath string
	if ok {
		cwdPath = path.Join(path.Dir(filename), "") // the the main function file directory
	} else {
		cwdPath = "./"
	}
	return cwdPath
}

func main() {
	nowPath := getCurrentPath()
	fmt.Println(nowPath)
	var res Result
	content, err := ioutil.ReadFile(nowPath + "/test.xml") // go运行路径不同导致 文件路径识别错误
	if err != nil {
		fmt.Println(err)
		return
	}
	err = xml.Unmarshal(content, &res)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println("XML文件解析后内容为：")
	fmt.Println(res)

}
